import json

from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from books.models import BookInfo
# 导入自定义的序列化器
from books.serializers import BookSerializer


# Create your views here.
class BooksView(View):

    def get(self, request):
        """
            获取所有图书
        :param request:
        :return:
        """

        # 查询所有图书数据
        books = BookInfo.objects.all()

        # 返回结果时使用序列化器
        # 初始化序列化器生成序列化器对象，将返回数据出入类中,注意：如果返回的数据是多个数据需要额外增加一个参数 many=True
        ser = BookSerializer(books, many=True)
        # 提取数据 ser.data
        return JsonResponse({'books': ser.data})

    def post(self, request):
        """
            保存图书操作
        :param request:
        :return:
        """

        # 1、获取数据 json 根据接口中规定的不同的数据形式进行获取
        data_json = request.body.decode()
        # 1-1 将json转化为字典
        data_dict = json.loads(data_json)
        # 1-2 提取字段数据
        btitle = data_dict.get('btitle')
        bpub_date = data_dict.get('bpub_date')
        # 2、验证数据
        # 使用序列化器完成数据验证功能  传递验证的数据给data灿忽视
        ser = BookSerializer(data=data_dict)
        # 调用验证方法 raise_exception=True 如果验证失败，有错误信息抛出异常
        try:
            ser.is_valid(raise_exception=True)
        except:
            # 捕获异常说明验证失败
            return JsonResponse(ser.errors, status=400)
        # # 获取验证信息 errors验证成功是空字典
        # print(ser.errors)
        # # 判断是否验证成功
        # if ser.errors:
        #     # 获取到了验证失败的信息，说明验证失败
        #     return JsonResponse(ser.errors)

        # 3、保存数据
        ser.save()
        # 4、返回结果
        # ser = BookSerializer(book)
        return JsonResponse(ser.data)


class BookView(View):

    def get(self, request, pk):
        """
            获取一本图书
        :param request:
        :return:
        :pk: 图书id数据
        """
        # 1、根据图书id获取图书
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '图书不存在'})
        # 2、返回图书数据
        ser = BookSerializer(book)
        return JsonResponse(ser.data)

    def put(self, request, pk):
        """
            更新一本图书
        :param request:
        :param pk:
        :return:
        """
        # 1、根据id获取要更新的图书对象
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '图书不存在'})
        # 2、获取更新的字段数据
        data_json = request.body.decode()
        # 2-1 将json转化为字典
        data_dict = json.loads(data_json)
        # 3、验证数据  更新业务中，初始化序列化器需要传递更新的对象
        ser = BookSerializer(book,data=data_dict)
        try:
            ser.is_valid(raise_exception=True)
        except:
            # 捕获异常说明验证失败
            return JsonResponse(ser.errors, status=400)
        # 4、更新数据 调用序列化器封装update更新方法
        ser.save()
        # 5、返回数据
        return JsonResponse(ser.data)

    def delete(self, request, pk):
        """
            删除一本图书
        :param request:
        :param pk:
        :return:
        """
        # 1、获取删除的图书对象
        try:
            book = BookInfo.objects.get(id=pk)
        except:
            return JsonResponse({'error': '图书不存在'})
        # 2、删除图书  物理删除 逻辑删除
        # book.delete()  # 物理删除
        book.is_delete = True
        book.save()
        # 3、返回结果
        return JsonResponse({})
